/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#include "stdafx.h"
#include "时间轴视口工作区.h"

#include "时间轴.h"
#include "曲线视口工作区.h"

#include "A_引擎/文件工程/工程文件.h"

#include "../ui属性栏.h"


using namespace std;




static S_Operator* g_Ops播放;
static S_Operator* g_Ops停止;

static S_Operator* g_Ops前一帧;
static S_Operator* g_Ops后一帧;


static C_状态条* g时间轴主状态条 = nullptr;






//播放帧动画是会调用此函数


static void on_模型显示模式控制(S_Props& prop) {

	switch (f_prop_enum(prop)) {
		case 0: {
		
			break;
		}
		case 1: {
		
			break;
		}
	}

}

static void f_工作区_时间轴布局(C_Widget* self, C_Widget** w, uint32 num) {
	auto& 帧 = f_NodeCtx_get帧();
	auto& time = 帧.帧区间;
	float32 帧数量 = float32(time.y - time.x);

	auto& view = *w[0];
	view.f_setW(帧数量 * S_时间轴帧绘制信息::g时间区间缩放 * view.m_Scale.x);
	view.f_setH(self->m_Size.y);
}

static void on_时间轴工作区_绘制(C_Widget* self, S_2D画布* 画布) {
	C_工作区页面& box = *dynamic_cast<C_工作区页面*>(self);
	box.m_背景 = f_vg_genConvex((*self), *画布, E_填充模式::e_填充面, E_图层混合模式::e_Normal);
}

static void on_时间轴工作区_变换(C_Widget* self) {
	C_工作区页面& box = *dynamic_cast<C_工作区页面*>(self);
	const float32 标签高度 = 20;

	S_2DConvexRect	区域[4]{};
	S_GPU内存块*	形状[4];
	S_RGBA8UI		颜色[4];
	vec2			位置[2];

	区域[0].offset = {};
	位置[0] = {};
	区域[0].size = self->m_Size;
	形状[0] = &(box.m_UIctx->m_Ctx.m_几何图形->m_平面圆角矩形);
	颜色[0] = S_主题颜色::uic_工作区页面背景;

	区域[1].offset = {};
	位置[1] = {};
	区域[1].size = {box.m_Size.x, 标签高度 * self->m_UIctx->m_DPI };
	形状[1] = &(box.m_UIctx->m_Ctx.m_几何图形->m_平面矩形);
	颜色[1] = S_主题颜色::uic_工作区页面背景 - S_RGBA8UI{10,10,10,0};

	f_vg_tranform(*box.m_背景, 2, 位置);
	f_vg_tranform(*box.m_背景, {});
	f_vg_drawConvex(*box.m_背景, 2, 形状, 区域);
	f_vg_color(*box.m_背景, 2, 颜色);
}

static bool on_时间轴视口打开关闭(C_Widget* self, bool show) {
	C_工作区页面* 工作区 = dynamic_cast<C_工作区页面*>(self);
	f_页面_渲染层配置(工作区, show);
	return false;
}

C_工作区页面* f_工作区_创建时间轴视口(S_UI渲染环境& ctx) {
	auto* ui时间轴 = f_创建时间轴页面(ctx);
	ui时间轴->mui_状态条->f_重构();


	auto* 滚动窗口 = f_ui_创建滚动框(ctx, true, false, ui时间轴);
	滚动窗口->mf_布局	= f_工作区_时间轴布局;
	

	滚动窗口->mf_开始拖拽		= f_时间轴页面_准备拖动;
	滚动窗口->mf_拖拽			= f_时间轴页面_手柄拖动;
	滚动窗口->mf_结束拖拽		= f_时间轴页面_结束拖放;
	滚动窗口->mf_鼠标按键按下	= f_时间轴页面鼠标按下;
	滚动窗口->mf_鼠标按键放开	= f_时间轴页面鼠标放开;
	滚动窗口->mf_鼠标移动		= f_时间轴页面鼠标位置改变;
	滚动窗口->mf_鼠标点击		= f_时间轴页面鼠标点击;
	//滚动窗口->mf_鼠标滚轮		= f_时间轴页面鼠标滚动;
	滚动窗口->mf_鼠标滚轮		= nullptr;

	
	S_鼠标键位映射* 鼠标键位 = f_widget_init_鼠标键位映射();
	鼠标键位 = f_widget_init_鼠标键位映射();
	鼠标键位->event = f_工作区_横向缩放页面视口;
	鼠标键位->鼠标按键[0] = E_Input_鼠标按键::e_滚轮;
	鼠标键位->鼠标状态[0] = DEF_按键状态_按下 | DEF_按键状态_按下中;
	鼠标键位->发生组件 = 滚动窗口;
	f_ui_注册鼠标快捷键(滚动窗口, (S_键位映射*)鼠标键位);


	S_拖拽键位映射* 拖拽键位 = f_widget_init_拖放键位映射();
	拖拽键位->event = f_时间轴页面工作区_拖拽时间帧;
	拖拽键位->鼠标按键[0] = E_Input_鼠标按键::e_左键;
	拖拽键位->鼠标状态[0] = DEF_按键状态_按下 | DEF_按键状态_按下中;
	拖拽键位->发生组件 = ui时间轴;
	//f_ui_注册鼠标快捷键(滚动窗口, (S_键位映射*)拖拽键位);


	C_工作区页面* 工作区 = new C_工作区页面(E_工作区类型::e_时间轴, ctx, E_方向::e_横向, 滚动窗口, ui时间轴->mui_状态条);
	工作区->mf_绘制	= on_时间轴工作区_绘制;
	工作区->mf_变换	= on_时间轴工作区_变换;
	工作区->mf_打开关闭	= on_时间轴视口打开关闭;
	f_widget_添加绘制画布(工作区);

	f_页面_渲染层配置(工作区, true);
	return 工作区;
}






E_事件是否传递 f_工作区_全局播放时间帧(C_Widget* self, E_键位执行状态 状态) {
	//cout << "f_工作区_播放时间帧 = " << f_工作区_播放时间帧 << endl;
	S_框架::g_播放帧 = !S_框架::g_播放帧;

	f_node_帧更新(S_框架::g_播放帧);

	//f_时间轴_刷新绘制();
	
	return E_事件是否传递::e_事件传递_终止;
}

E_事件是否传递 f_工作区_时间帧步进(C_Widget* self, E_键位执行状态 状态) {
	f_node_帧更新(true);
	//f_时间轴工作区_刷新绘制(-C_Widget::g_鼠标.lZ);
	f_时间工作区_帧步进(-C_Widget::g_鼠标.lZ);
	return E_事件是否传递::e_事件传递_终止;
}

void f_时间轴页面_联动更新() {
	//for (auto& e : C_时间轴::g_当前时间轴页面) {
	//	if (!e->m_被裁剪) {
	//		e->f_刷新界面绘制();
	//	}
	//}

	f_时间轴_刷新绘制();
}

void f_时间轴页面_销毁() {
	C_时间轴::g_当前时间轴页面.clear();
}

